home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Tools / Emulatoren / UAE0.6.4 / src / include / compiler.h < prev    next >
C/C++ Source or Header  |  2000-05-27  |  2KB  |  93 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * m68k -> i386 compiler
  5.   *
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. typedef CPTR (*code_execfunc)(void);
  10.  
  11. struct code_page {
  12.     struct code_page *next;
  13.     ULONG allocmask;
  14. };
  15.  
  16. struct hash_block {
  17.     struct hash_block *lru_next, *lru_prev;
  18.     struct hash_entry *he_first;
  19.  
  20.     struct code_page *cpage;
  21.     int alloclen;
  22.     ULONG page_allocmask;
  23.     char *compile_start;
  24.     
  25.     int nrefs;
  26.  
  27.     int translated:1;
  28.     int untranslatable:1;
  29.     int allocfailed:1;
  30. };
  31.  
  32. struct hash_entry {
  33.     struct hash_entry *next,*prev;
  34.     struct hash_entry *next_same_block, *lru_next, *lru_prev;
  35.     struct hash_block *block;
  36.     
  37.     code_execfunc execute;
  38.     CPTR addr;
  39.     ULONG matchword;
  40.     int ncalls:8;
  41.     int locked:1;
  42.     int cacheflush:1;
  43. };
  44.  
  45. extern int nr_bbs_start;
  46. extern UBYTE nr_bbs_to_run;
  47. extern code_execfunc exec_me;
  48.  
  49. #ifdef USE_COMPILER
  50. static __inline__ void run_compiled_code(void)
  51. {
  52.     if (regs.spcflags == SPCFLAG_EXEC) {
  53.     while (regs.spcflags == SPCFLAG_EXEC) {
  54.         CPTR newpc;
  55.         regs.spcflags = 0;
  56.         /*        newpc = (*exec_me)();*/
  57.         __asm__ __volatile__ ("pushl %%ebp; call *%1; popl %%ebp" : "=a" (newpc) : "r" (exec_me) :
  58.                   "%eax", "%edx", "%ecx", "%ebx",
  59.                   "%edi", "%esi", "memory", "cc");
  60.         if (nr_bbs_to_run == 0) {
  61.         struct hash_entry *h = (struct hash_entry *)newpc;
  62.         regs.spcflags = SPCFLAG_EXEC;
  63.         exec_me = h->execute;
  64.         regs.pc = h->addr;
  65.         regs.pc_p = regs.pc_oldp = get_real_address(h->addr);
  66.         nr_bbs_to_run = nr_bbs_start;
  67.         } else
  68.         m68k_setpc_fast(newpc);
  69.         do_cycles();
  70.     }
  71.     } else 
  72.     regs.spcflags &= ~SPCFLAG_EXEC;
  73. }
  74.  
  75. extern void compiler_init(void);
  76. extern void possible_loadseg(void);
  77.  
  78. #else
  79.  
  80. static __inline__ void run_compiled_code(void)
  81. {
  82. }
  83.  
  84. static __inline__ void compiler_init(void)
  85. {
  86. }
  87.  
  88. static __inline__ void possible_loadseg(void)
  89. {
  90. }
  91.  
  92. #endif
  93.